/**
 * @addtogroup ofc_types.h
 * ofc_types.h
 * @{
 */
/**
 * @file ofc_types.h
 * @brief 基础定义
 * @note
 * @author Leo

 * @par          修改日志
 * <table>
 * <tr><th>Date<th>Version<th>Author<th>Description
 * <tr><td>2019-05-24<td>1.0<td>Leo<td>创建初始版本
 * <tr><td>2019-11-13<td>1.1<td>Leo<td>oc_types.h->ofc_types.h, 去掉ofc库中不用的定义
 * <tr><td>2019-12-24<td>1.2<td>Akee<td>TTime从int改为long
 * <tr><td>2020-07-04<td>1.3<td>Leo<td>加入Long的定义
 * <tr><td>2020-07-29<td>1.4<td>Akee<td>加入CONTAINER_OF的定义 
 * <tr><td>2020-08-21<td>1.5<td>Ada
 * <td> 1.去掉__int64_t、__uint64_t的定义 \n
 *      2.加入详细注解
 * <tr><td>2020-12-29<td>1.6<td>Leo<td>
 * 1. 为了保持与Kyee的库一致,直接引用Kyee的BaseTypes.h库,并把头文件中的相关内容去掉
 * 2. CONTAINER_OF改成OF_CONTAINER_OF
 * 3. NULL从原先(void *)0,改成0
 * @copyright 杭州鸿泉物联网技术股份有限公司
 */
#ifndef _OFC_TYPES_H_
#define _OFC_TYPES_H_

#include "BaseTypes.h"

#ifdef __cplusplus
extern "C"
{
#endif

//--------------------------------------------------------------------------------
// 常用宏定义
/**@brief 获取成员变量在结构体中的相对位置
 * @param Type 结构体的类型
 * @param member 结构体中的成员变量
 * @return 成员变量的位置,类型为Long
 * @par 示例:
 * @code
 *     未压缩的情况下:
 *     struct TA{ 
 *	       @ref Int32 a;   // OF_OFFSET_OF(TA,a) 返回值0 

 *	       @ref Int8 b;    // OF_OFFSET_OF(TA,b) 返回值4 
 
 *	       @ref Int8 c;    // OF_OFFSET_OF(TA,c) 返回值5 

 *	       @ref Int32 d    // OF_OFFSET_OF(TA,d) 返回值8 
 *					  }


 *	    压缩的情况下:
 *     struct TA{ 
 *	       @ref Int32 a;   // OF_OFFSET_OF(TA,a) 返回值0 

 *	       @ref Int8 b;    // OF_OFFSET_OF(TA,b) 返回值4 

 *	       @ref Int8 c;    // OF_OFFSET_OF(TA,c) 返回值5 

 *	       @ref Int32 d    // OF_OFFSET_OF(TA,d) 返回值6 
 *					  }
 * @endcode
 */
#define OF_OFFSET_OF(Type, member) ((Long)&((Type*)0)->member)

#ifndef OF_CONTAINER_OF
#define OF_CONTAINER_OF(ptr, type, member)\
    (type *)( (char *)ptr - OF_OFFSET_OF(type, member));
#endif


/** @brief 指针类型的大小

 * - 若MCU为64位,则OF_SIZEOF_PTR等于8
 * - 若MCU为32位,则OF_SIZEOF_PTR等于4
 * @{
 */
#if defined(__CC_ARM)
  #if (__sizeof_ptr == 8)
    #define OF_SIZEOF_PTR 8
  #else
    #define OF_SIZEOF_PTR 4
  #endif
#else
  #if (__SIZEOF_LONG__ == 8)
    #define OF_SIZEOF_PTR 8
  #else
    #define OF_SIZEOF_PTR 4
  #endif
#endif
/** @} */
//--------------------------------------------------------------------------------
// 常量定义

/// 空指针值
/*
#ifndef NULL
#define NULL  ((void *)0)
#endif
*/

/*
#ifndef True
// 布尔值假
#define False 0
// 布尔值真
#define True  1
#endif
*/

#ifndef TRUE
/// 布尔值假
#define FALSE  0
/// 布尔值真
#define TRUE   1
#endif

//--------------------------------------------------------------------------------
/**
 * @name 类型定义 
 */
/// 用于表示数据大小的类型 
/// armcc: 32位4字节,64位8字节 gcc: 32位4字节,64位8字节
#if defined(__CC_ARM)
#if (OF_SIZEOF_PTR == 8)
    typedef unsigned long TSize;
#else
    typedef unsigned int TSize;
#endif
#else
#if (OF_SIZEOF_PTR == 8)
    typedef long unsigned int TSize;
#else
    typedef unsigned int TSize;
#endif
#endif

/*
#ifndef _BaseTypes_H_
#if defined(_WIN32) || defined(_WIN64) || defined(_WINDOWS) || defined(WINCE)
    typedef unsigned __int64 UInt64;
    typedef __int64 Int64;
#elif defined(__linux)
    typedef long long Int64;
    typedef unsigned long long UInt64;
#else
    typedef long long Int64;
    typedef unsigned long long UInt64;
#endif
*/

/**
 * @name 有符号整型
 */
/*
typedef signed int Int32;
typedef signed short Int16;
typedef signed char Int8;
typedef signed long Long;  // Leo: 2020-07-04
*/

/**
 * @name 无符号整型
 */
/*
typedef unsigned int UInt32;      
typedef unsigned short UInt16;       
typedef unsigned char UInt8; 

typedef UInt64 QWord;
typedef unsigned int DWord;
typedef unsigned short Word;
typedef unsigned char Byte;
*/

/** 
 * @name bool类型
 */
//typedef unsigned char Bool; 

/**
 * @name 时间类型
 */
/// 用于表示时间的类型(同time_t)
typedef long TTime;

#ifdef __cplusplus
}  // extern "C"
#endif

#endif //_OFC_TYPES_H_

/**
 * @}
 */
